package com.hand.wfive.loginAndVip;


import com.hand.wfive.App;
import com.hand.wfive.R;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;

public class MD5Utils {

    private static final String CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+";

    /**
     * 生成指定长度的复杂随机字符串
     *
     * @param length 随机字符串长度
     * @return 随机字符串
     */
    public static String getComplexRandomString(int length) {
        if (length < 1) {
            throw new IllegalArgumentException("随机字符串长度必须大于等于1");
        }
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int index = random.nextInt(CHARACTERS.length());
            sb.append(CHARACTERS.charAt(index));
        }
        return sb.toString();
    }


    /**
     * MD5加密 通过将盐值和密码进行加密，进行混淆
     * 登录的时候就通过密码和数据库中的盐值进行拼接 进行MD5加密后的结果是否相同
     *
     * @param content
     */
    private static String encryptByMd5(String content) {
        try {
            // 获取一个MD5消息摘要实例
            MessageDigest md = MessageDigest.getInstance("MD5");

            // 更新消息摘要，将输入的文本内容转换为字节数组并进行处理
            md.update(content.getBytes(StandardCharsets.UTF_8));

            // 计算消息摘要，得到MD5散列值
            byte[] encryContext = md.digest();

            int i;
            StringBuilder buf = new StringBuilder();
            for (byte b : encryContext) {
                // 将字节值转换为无符号整数
                i = b;
                if (i < 0) i += 256;  // 处理负值
                if (i < 16) buf.append("0");  // 补充前导0，以保证每个字节都被表示为两位十六进制数
                buf.append(Integer.toHexString(i));  // 将字节值转换为十六进制字符串并追加到结果字符串
            }

            // 返回MD5散列值的十六进制表示
            return buf.toString();
        } catch (NoSuchAlgorithmException e) {
            // 处理NoSuchAlgorithmException异常，通常是因为指定的MD5算法不可用
            e.printStackTrace();
            return null;
        }
    }

    public static String getMd5Str(String data) {
        String encrypedOne = encryptByMd5(data + getValue1());
        String encrypedTwo = encryptByMd5(encrypedOne+ getValue2());
        return encryptByMd5(encrypedTwo + getValue3());
    }

    private static String getValue1(){
        return App.getContext().getString(R.string.en_key1).replace("@", "%") +
                LoginConfig.AppId;
    }

    private static String getValue2(){
        return App.getContext().getString(R.string.en_key2).replace("%", "&") +
                LoginConfig.AppId;
    }

    private static String getValue3(){
        return App.getContext().getString(R.string.en_key3).replace("%", "#") +
                LoginConfig.AppId;
    }

}